#include <Arduino.h>
#include "esp_wifi.h"
#include <WiFiManager.h>

#include "pwifi.h"
#include "config.h"
#include "plog.h"
#include "my_u8g2.h"

void pwifi_ap_mode_init(void)
{
  WiFi.mode(WIFI_AP);
  delay(300);
  while (!WiFi.softAP(WIFI_AP_MODE_SSID, WIFI_AP_MODE_PASSWORD))
  {
    LOG_ERROR("wifi ap mode init failed! retrying");
    delay(100);
  }
// 一直开启时才需要降低功率
#ifdef WEB_SERVER_DEFAULT_ON
  // note:这里对于发热的优化效果不是太大
  int8_t default_power;
  esp_wifi_get_max_tx_power(&default_power);
  // 设置发射功率（单位：dBm，范围8~20）,默认是20dBm
  esp_wifi_set_max_tx_power(10 * 4); // 10dBm（乘以4转换为0.25dBm单位）
  // 实际功率验证
  int8_t actual_power;
  esp_wifi_get_max_tx_power(&actual_power);
  LOG_DEBUG("实际发射功率: %.1f dBm (默认发射功率: %.1f dBm)", actual_power / 4.0, default_power / 4.0);
#endif
  LOG_INFO("wifi ap mode started! IP: %s", WiFi.softAPIP().toString());
}

WiFiManager wifiManager;
void pwifi_sta_mode_init(void)
{
  LOG_INFO("wifi sta mode started!");
  wifiManager.setConfigPortalBlocking(false);
  wifiManager.setConnectTimeout(5); // 连接配置的wifi超时时间 s
  // wifiManager.setConfigPortalTimeout(60); // 网络配置timeout限制，超过60s不配置就退出

  // 先开启ap mode，等待连接配置
  bool res = wifiManager.autoConnect(WIFI_AP_MODE_SSID, WIFI_AP_MODE_PASSWORD);
  if (res)
  { // 使用saved ap直接连接成功了
    LOG_INFO("connected to saved wifi :) ssid: %s, ip: %s", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
    U8G2_wifi_wifimanager_finished(WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
  }
  else
  {
    LOG_INFO("wifimanager started! 1.connect SSID: %s 2.visit %s 3.config your WiFi~",
             wifiManager.getConfigPortalSSID().c_str(), WiFi.softAPIP().toString().c_str());
    // note：会阻塞调用
    while (!wifiManager.process())
    {
      // Serial.print(".");
      U8G2_wifi_wifimanager_waiting(wifiManager.getConfigPortalSSID().c_str(), WiFi.softAPIP().toString().c_str());
      delay(100);
    }
    LOG_INFO("wifimanager finished! link to %s! got IP: %s", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
    U8G2_wifi_wifimanager_finished(WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());
  }
}

const char *modes[] = {"OFF", "STA", "AP", "STA+AP"};
void pwifi_sta_close(void)
{
  WiFi.disconnect(true); // true = 同时关闭 STA 接口
  delay(300);
  WiFi.mode(WIFI_OFF);

  LOG_INFO("wifi sta mode closed: %s", modes[WiFi.getMode()]);
}

void pwifi_ap_close(void)
{
  // todo 这里可能是个隐患，2个顺序调换一下就不报错了，但是可能会存在其他问题
  WiFi.mode(WIFI_OFF);
  delay(300);
  WiFi.softAPdisconnect(true);

  LOG_INFO("wifi ap mode closed: %s", modes[WiFi.getMode()]);
}

void pwifi_sta_reset(void)
{
  LOG_INFO("reset wifi sta settings");
  wifiManager.resetSettings();
}

void pwifi_flash_erase(void)
{
  LOG_WARN("erase all flash !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
  wifiManager.erase(true);
  delay(1000);
  wifiManager.reboot();
}
